package br.com.hstar.client.cliente.cliente;

import java.util.Iterator;
import java.util.List;

import br.com.hstar.client.ServiceFactory;
import br.com.hstar.client.cliente.tipocliente.TipoClienteUI;
import br.com.hstar.client.util.FormPanel;
import br.com.hstar.client.util.HstarDialogBox;
import br.com.hstar.client.util.HstarUserException;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class ClienteEditPanel extends FormPanel {

	private Button incluir;
	private Button cancelar;
	private Button excluir;
	
	private TextBox nome;
	private ListBox tipoCliente;
	private TextBox nomeFantasia;
	private TextBox telefone;
	private TextBox celular;
	private TextBox identidade;
	private TextBox cpf;
	private TextBox placa;
	private TextArea observacao;
	private ClienteUI clienteUI;

	public ClienteEditPanel(String _title) {
		super(_title);
		clienteUI = new ClienteUI();
		init(true);
	}
	
	public ClienteEditPanel(String _title, Long id) {
		super(_title);
		clienteUI = new ClienteUI();
		clienteUI.setId(id);
		init(false);
		ServiceFactory.createClienteService().retrieveById(id, new RetrieveAsyncCallback());
	}
	
	
	
	//Methods -------------------------------------------------------------------
	
	private void init(boolean isNew) {
		
		nome			= addTextBox("Nome", 30, 30, "");
		tipoCliente		= addListBox("Tipo do Cliente", true);
		ServiceFactory.createTipoClienteService().listAll(new ListAllTipoClientesAsyncCallback());
		nomeFantasia	= addTextBox("Nome Fantasia", 30, 30, "");
		telefone		= addTextBox("Telefone", 14, 20, "");
		celular			= addTextBox("Celular", 14, 20, "");
		identidade		= addTextBox("Identidade", 14, 20, "");
		cpf				= addTextBox("CPF", 14, 20, "");
		placa			= addTextBox("Placa", 8, 15, "");
		observacao		= addTextArea("Observação", "300", "200", "");
		
		
		if(isNew) {
			incluir  = addButton("Incluir");
			cancelar = addButton("Cancelar");
		} else {
			incluir  = addButton("Alterar");
			cancelar = addButton("Cancelar");
			excluir = addButton("Excluir");
			excluir.addClickListener(new ClickListener() {
				public void onClick(Widget sender) {
					ServiceFactory.createClienteService().delete(clienteUI.getId(), new DeleteAsyncCallback());
				}
			});
		}
		
		incluir.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				 try {
					copyData();
					ServiceFactory.createClienteService().saveOrUpdate(clienteUI, new SaveAsyncCallback());
				} catch (HstarUserException e) {
					new HstarDialogBox("Cliente", e.getMessage());
				}
				 
			}
		});
		cancelar.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				RootPanel.get("boxContent").clear();
				RootPanel.get("boxContent").add(new ClienteListPanel("Cliente"));
			}
		});
		
	}

	private void copyData() throws HstarUserException {
		
		String msgErro = "";
		
		if(nome.getText().trim() == "")
		{			
			msgErro += " - O Nome do cliente é obrigatório. <br>";
		}
		
		if(msgErro != "")
		{
			throw new HstarUserException(msgErro);			
		}
		
		if(tipoCliente.getSelectedIndex() > 0) {
			clienteUI.setTipoCliente(new TipoClienteUI(
					new Long(tipoCliente.getValue(tipoCliente.getSelectedIndex()))));
		}
		
		clienteUI.setNome(nome.getText().trim());
		clienteUI.setNomeFantasia(nomeFantasia.getText().trim());
		clienteUI.setTelefone(telefone.getText().trim());
		clienteUI.setCelular(celular.getText().trim());
		clienteUI.setIdentidade(identidade.getText().trim());
		clienteUI.setCpf(cpf.getText().trim());
		clienteUI.setPlaca(placa.getText().trim());
		clienteUI.setObservacao(observacao.getText().trim());
			
	}

	// INNER CLASSES ----------------------------------------------------------------
	private class SaveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			if(caught instanceof HstarUserException)
			{					
				new HstarDialogBox("",caught.getMessage());
			}
		}
		
		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new ClienteListPanel("Cliente"));
		}
	}
	
	private class DeleteAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Cliente edit panel");
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new ClienteListPanel("Cliente"));
		}
	}
	
	//carrega os campos. Usado para quando está editando
	private class RetrieveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Cliente");
		}

		public void onSuccess(Object result) {
			ClienteUI cliente = (ClienteUI)result;

			nome.setText(cliente.getNome().trim());
			nomeFantasia.setText(cliente.getNomeFantasia().trim());
			telefone.setText(cliente.getTelefone().trim());
			celular.setText(cliente.getCelular().trim());
			identidade.setText(cliente.getIdentidade().trim());
			cpf.setText(cliente.getCpf().trim());
			placa.setText(cliente.getPlaca().trim());
			observacao.setText(cliente.getObservacao().trim());
			
			
			
			if (tipoCliente != null && cliente.getId() != null) {
				for(int i = 1; i < (tipoCliente.getItemCount()); i++) {
					if (cliente.getTipoCliente() != null)
					if(tipoCliente.getItemText(i).equals(cliente.getTipoCliente().getValue(1))) {
						tipoCliente.setSelectedIndex(i);
						break;
					}
				}
			}
			
			
		}
	}
	
//	lista todos os tipo clientes para colocar no listbox
	private class ListAllTipoClientesAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO Cliente");
		}

		public void onSuccess(Object result) {
			List clientes = (List) result;
			for (Iterator iter = clientes.iterator(); iter.hasNext();) {
				TipoClienteUI tipoClienteUI = (TipoClienteUI) iter.next();
				tipoCliente.addItem(tipoClienteUI.getDescricao(), tipoClienteUI.getId().toString());				
			}
		}
	}

}      